package com.spzx.product.handler;

import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import com.spzx.product.api.domain.Category;
import com.spzx.product.service.CategoryService;

import java.util.ArrayList;
import java.util.List;

/*
    用来解析分类数据的excel文件的监听器
 */
//@Component
public class CategoryExcelListener extends AnalysisEventListener<Category> {
    private int limit = 100;
//    @Resource //by name  jdk自带注解
////    @Autowired //by type 装配时 如果同一类型有多个实现  优先装配加了@Primary注解的组件类对象
//    @Lazy  //懒自动装配：等需要使用该对象时，才从容器中装配
//    private CategoryService categoryService;


    private CategoryService categoryService;
    private List<Category> categories = new ArrayList<>();//监听器对象创建时 立即初始化缓存集合

    public CategoryExcelListener(CategoryService categoryService) {
        this.categoryService = categoryService;
    }

    //每行数据回调一次
    @Override
    public void invoke(Category data, AnalysisContext context) {
        //数据校验：如果数据不存在才插入 如果数据已存在 不插入
        // 1、如果id已存在 表示数据重复
        // 2、同一级pid 下 所有的分类不能重名
        boolean exists = categoryService.categoryExists(data);
        if(exists){
            return;//本次读取到的分类 数据库表中已存在
        }
        //保存读取到的行数据到缓存集合中
        categories.add(data);
        //集合中的元素个数达到阈值
        if(categories.size()>=limit){
            //批量保存
            categoryService.saveBatch(categories);
            //清空缓存集合
            categories.clear();
        }
    }
    //整个文件读取完毕后回调一次
    @Override
    public void doAfterAllAnalysed(AnalysisContext context) {
        if(categories.size()> 0 ){
            //批量保存
            categoryService.saveBatch(categories);
            //清空缓存集合
            categories.clear();
        }
    }
}
